package dao;

import beans.AffectePromo;
import beans.Promotion;
import beans.Utilisateur;
import static dao.DAOUtilitaire.fermeturesSilencieuses;
import static dao.DAOUtilitaire.initialisationRequetePreparee;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

public class AffectePromoUtilisateurDAOImpl implements AffectePromoUtilisateurDAO {
    
    private final static String SQL_SELECT_UTILISATEUR_PAR_PROMO="SELECT u.id_utilisateur,u.nom,u.prenom FROM utilisateur u,affecte_promo_utilisateur apu WHERE u.id_utilisateur=apu.utilisateur AND apu.promotion=? AND u.type_utilisateur=?  ";
    private final static String SQL_SELECT_PROMOTION_PAR_UTILISATEUR="SELECT p.id_promo, p.libelle_promo, p.annee_promo FROM promotion p,affecte_promo_utilisateur apu WHERE p.id_promo=apu.promotion AND apu.promotion=? ";
    private static final String SQL_INSERT = "INSERT INTO affecte_promo_utilisateur (utilisateur, promotion) VALUES (?, ?)";
    
    private DAOFactory daoFactory;
    private JOptionPane jop1;
    
    public AffectePromoUtilisateurDAOImpl(DAOFactory daoFactory) {
        this.daoFactory=daoFactory;
    }
    
    private static AffectePromo map( ResultSet resultSet ) throws SQLException {
        AffectePromo apu =new AffectePromo();
        apu.setPromotion(resultSet.getInt("promotion"));
        apu.setUtilisateur(resultSet.getInt("utilisateur"));
       return apu;
    }  
     private static Utilisateur mapUtilisateur( ResultSet resultSet ) throws SQLException {
        Utilisateur utilisateur = new Utilisateur();
        utilisateur.setId(resultSet.getInt("id_utilisateur"));
        utilisateur.setNom( resultSet.getString( "nom" ) );
        utilisateur.setPrenom(resultSet.getString("prenom"));
        return utilisateur;
    }  
    private static Promotion mapPromo( ResultSet resultSet ) throws SQLException {
        Promotion promotion = new Promotion();
        promotion.setId_promo(resultSet.getInt("id_promotion"));
        promotion.setLibelle_promo( resultSet.getString( "libelle_promotion" ) );
        promotion.setAnnee_promo(resultSet.getInt("annee_promotion"));
        return promotion;
    }  
     

    public List<Utilisateur> trouverUtilisateurs(Promotion promo, Integer type) throws DAOException {
        Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        Utilisateur utilisateur=null;
        
        List<Utilisateur> utilisateurs = new ArrayList<Utilisateur>();
        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
           
            preparedStatement = initialisationRequetePreparee( connexion, SQL_SELECT_UTILISATEUR_PAR_PROMO, false, promo.getId_promo().intValue(), type.intValue());
            jop1 = new JOptionPane();
                jop1.showMessageDialog(null, "Message informatif :"+type.intValue()+" "+promo.getId_promo(), "Information", JOptionPane.INFORMATION_MESSAGE);
            resultSet = preparedStatement.executeQuery();
            /* Parcours de la ligne de données de l'éventuel ResulSet retourné */
           
            while ( resultSet.next() ) {
                utilisateur=mapUtilisateur(resultSet);
                
                utilisateurs.add(utilisateur);
            }
        } catch ( SQLException e ) {
            throw new DAOException( e );
        } finally {
            fermeturesSilencieuses( resultSet, preparedStatement, connexion );
        }
        return utilisateurs;      
    }

    @Override
    public List<Promotion> trouverPromotions(Utilisateur utilisateur) throws DAOException {
       Connection connexion = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        Promotion promotion=null;
        List<Promotion> promotions = new ArrayList<Promotion>();
        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            preparedStatement = initialisationRequetePreparee( connexion, SQL_SELECT_PROMOTION_PAR_UTILISATEUR, false, utilisateur.getId());
            resultSet = preparedStatement.executeQuery();
            /* Parcours de la ligne de données de l'éventuel ResulSet retourné */
            while ( resultSet.next() ) {
                promotion=mapPromo(resultSet);
                promotions.add(promotion);
            }
        } catch ( SQLException e ) {
            throw new DAOException( e );
        } finally {
            fermeturesSilencieuses( resultSet, preparedStatement, connexion );
        }
        return promotions;  
    }
    
    public void creerAPU(AffectePromo apu) {
        
        Connection connexion = null;
        PreparedStatement preparedStatement = null;

        try {
            /* Récupération d'une connexion depuis la Factory */
            connexion = daoFactory.getConnection();
            preparedStatement = initialisationRequetePreparee( connexion, SQL_INSERT, true,apu.getUtilisateur(), apu.getPromotion());
            int statut = preparedStatement.executeUpdate();
            /* Analyse du statut retourné par la requête d'insertion */
            if ( statut == 0 ) {
                throw new DAOException( "Échec de la création de l'examen, aucune ligne ajoutée dans la table." );
            }
            
        } catch ( SQLException e ) {
            throw new DAOException( e );
        } finally {
            fermeturesSilencieuses(preparedStatement, connexion );
        }
        
    }
    
}
